﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using QLNH_DAO_WS.DataEntity;
using System.Data.Objects;

namespace QLNH_DAO_WS.DAO
{
    public abstract class AbstractDAO<P, K>
    {
        protected abstract Type GetEntityClass();
        protected abstract string GetEntityListType();

        public List<P> LayDanhSach()
        {
            QLNHangEntities context = Singleton.GetContext();
            
            String sql = string.Format("SELECT VALUE data FROM QLNHangEntities.{0} as data", GetEntityListType());
            ObjectQuery<P> query = context.CreateQuery<P>(sql);
            return query.ToList();

        }

        public P LayDuLieuBangID(int id)
        {
            QLNHangEntities context = Singleton.GetContext();

            String sql = string.Format("SELECT VALUE data FROM QLNHangEntities.{0} as data WHERE data.Ma{1}=@id", GetEntityListType(), GetEntityClass().Name);
            ObjectQuery<P> query = context.CreateQuery<P>(sql, new ObjectParameter("id", id));
            P p = query.First();
            return p;
        }

        public void Them(P p)
        {
            QLNHangEntities context = Singleton.GetContext();

            context.AddObject(GetEntityListType(), p);
            context.SaveChanges();
        }

        public void Xoa()
        {
            QLNHangEntities context = Singleton.GetContext();
            context.SaveChanges();
        }

        public void CapNhat(P p)
        {
            QLNHangEntities context = Singleton.GetContext();

            //Vì trùng key nên Detach object có sẵn và Attach object mới vào
            object o = context.GetObjectByKey(context.CreateEntityKey(GetEntityListType(), p));
            context.Detach(o);
            context.AttachTo(GetEntityListType(), p);

            //Trạng thái hiện tại là Unchanged phải set trạng thái thành Modified thì dữ liệu mới lưu
            context.ObjectStateManager.GetObjectStateEntry(p).SetModified();

            //Phải refresh thì mới SaveChanges được
            context.Refresh(RefreshMode.ClientWins, p); 

            context.SaveChanges();
        }

    }



}